package basic;

/**
 * 位运算
 */
public class BitwiseMain {

    public static void main(String[] args) {
        bitwiseOperation();
        binaryConversion();
    }

    //位运算符号
    static void bitwiseOperation() {
        System.out.println("位运算符 --->>> ");

        int a = 5;//00000000 00000000 00000000 00000101
        int b = 3;//00000000 00000000 00000000 00000011
        //与运算的规则是：只有当两个对应位都为 1 时，结果位才为 1，否则为 0。
        System.out.println("与运算 a & b  " + (a & b));//0001
        //或运算的规则是：只要两个对应位中有一个为 1，结果位就为 1，只有当两个位都为 0 时，结果位才为 0。
        System.out.println("或运算 a | b  " + (a | b));//0111
        //异或运算的规则是：只有当两个对应位不相等时，结果位才为 1，否则为 0。
        System.out.println("异或运算 a ^ b  " + (a ^ b));//0110
        //取反运算的规则是：对每个位取反。 即 0 变为 1，1 变为 0。
        System.out.println("取反运算 ~a  " + (~a));//111111111 111111111 111111111 11111010
        //左移运算会将二进制位向左移动指定的位数，右边空出的位用 0 填充。
        System.out.println("左移运算 a << 2  " + (a << 2));//00000101 -> 00010100
        //右移运算会将二进制位向右移动指定的位数，左边空出的位用符号位填充（正数用 0 填充，负数用 1 填充）。
        System.out.println("右移运算 a >> 1  " + (a >> 1));//00000101 -> 00000010
        //无符号右移运算会将二进制位向右移动指定的位数，左边空出的位用 0 填充，不考虑符号位。
        System.out.println("无符号右移运算 a >>> 1  " + (a >>> 1));//00000101 -> 00000010
    }

    static void binaryConversion() {
        System.out.println("二进制 八进制 十进制 十六进制转化 --->>> ");

        String binaryString = Integer.toBinaryString(20);
        System.out.println("十进制->二进制 " + binaryString);
        Integer binary = Integer.valueOf("1010", 2);
        System.out.println("二进制->十进制  " + binary);

        String octalString = Integer.toOctalString(20);
        System.out.println("十进制->八进制 " + octalString);
        Integer octal = Integer.valueOf("234", 8);
        System.out.println("八进制->十进制  " + octal);

        String hexString = Integer.toHexString(20);
        System.out.println("十进制->十六进制 " + hexString);
        Integer hex = Integer.valueOf("ab1", 16);
        System.out.println("十六进制->十进制  " + hex);
    }

}


